import dayjs from 'dayjs';


export const safeDateFormat = (
  date: string | Date | dayjs.Dayjs | null | undefined,
  format: string = 'YYYY-MM-DD HH:mm:ss',
  invalidPlaceholder: string = '-'
): string => {
  // 检查空值
  if (date === null || date === undefined) {
    return invalidPlaceholder;
  }

  // 检查无效的日期字符串（如"0000-00-00"）
  if (typeof date === 'string' && !date.trim()) {
    return invalidPlaceholder;
  }

  try {
    const parsedDate = dayjs(date);
    // 检查dayjs对象是否有效
    return parsedDate.isValid() ? parsedDate.format(format) : invalidPlaceholder;
  } catch (e) {
    console.warn(`日期格式化失败:`, date, e);
    return invalidPlaceholder;
  }
};


/**
 * 将本地时间字符串安全转换为UTC格式
 * @param localDateStr 本地时间字符串（支持格式：YYYY-MM-DD 或 YYYY-MM-DDTHH:mm:ss）
 * @param isEndOfDay 是否设置为当天最后一刻（用于结束时间）
 */
export const toUTC = (localDateStr?: string, isEndOfDay = false): string | null => {
  if (!localDateStr) return null;
  
  // 自动补全时间部分（处理纯日期场景）
  const normalizedDateStr = localDateStr.includes('T') 
    ? localDateStr 
    : `${localDateStr}T00:00:00`;

  const date = new Date(normalizedDateStr);
  
  // 处理结束时间（设置为23:59:59）
  if (isEndOfDay) {
    date.setHours(23, 59, 59, 999);
  }

  // 关键时区转换逻辑
  return new Date(
    date.getTime() - date.getTimezoneOffset() * 60 * 1000
  ).toISOString();
};




/**
 * 将时间戳格式化为本地时间
 * @param timestamp 时间戳（毫秒）
 * @param format 格式字符串，默认为 'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的本地时间字符串
 */
export const formatToLocalTime = (
  timestamp: number,
  format: string = 'YYYY-MM-DD HH:mm:ss',
): string => {
  try {
    const userTimeZone = dayjs.tz.guess();
    return dayjs(timestamp).tz(userTimeZone).format(format);
  } catch (e) {
    console.error('Error formatting date:', e);
    return dayjs(timestamp).format(format);
  }
};


/**
 * 将时间戳格式化为UTC时间
 * @param timestamp 时间戳（毫秒）
 * @param format 格式字符串
 * @returns 格式化后的UTC时间字符串
 */
export const formatToUTC = (
  timestamp: number,
  format: string = 'YYYY-MM-DD HH:mm:ss',
): string => {
  return dayjs(timestamp).utc().format(format);
};

/**
 * 获取相对时间（如"2分钟前"）
 * @param timestamp 时间戳（毫秒）
 * @returns 相对时间字符串
 */
export const getRelativeTime = (timestamp: number): string => {
  return dayjs(timestamp).fromNow();
};

/**
 * 获取用户当前时区
 * @returns 时区字符串，如 'Asia/Shanghai'
 */
export const getUserTimeZone = (): string => {
  return dayjs.tz.guess();
};